Getting started
Loading essentia.js
-
Using CDN
CDN links are available for serving essentia.js from jsDelivr and unpkg.
You can also find the latest releases on Github releases.
-
HTML
<script>tag
<script src="https://cdn.jsdelivr.net/npm/essentia.js@<version>/dist/essentia-wasm.web.js"></script>
<script src="https://cdn.jsdelivr.net/npm/essentia.js@<version>/dist/essentia.js-*.js"></script>
-
ES6 style import
import Essentia from 'https://cdn.jsdelivr.net/npm/essentia.js@<version>/dist/essentia.js-core.es.js';
// import essentia-wasm-module
import { EssentiaWASM } from 'https://cdn.jsdelivr.net/npm/essentia.js@<version>/dist/essentia-wasm.es.js';
const essentia = new Essentia(EssentiaWASM);
// prints version of essentia wasm backend
console.log(essentia.version)
// prints all the available algorithm methods in Essentia
console.log(essentia.algorithmNames)
Note: You shouldn't import the
essentia-wasm.es.json the main thread. The ideal way is to use it along with the AudioWorklet design pattern or with WebWorkers. For async load of the library on main UI thread useessentia-wasm.web.js.
-
NPM users
npm install essentia.js
For Yarn users
yarn add essentia.js
Usage example
let esPkg = require('essentia.js');
const essentia = new esPkg.Essentia(esPkg.EssentiaWASM);
// prints version of the essentia wasm backend
console.log(essentia.version)
// prints all the available algorithm methods in Essentia
console.log(essentia.algorithmNames)
Try it live on Runkit.
Usages in Javascript
After succesfully loading essentia.js-core** and essentia-wasm.** files on the JavaScript end, a typical usage would be like the following.
import Essentia from './essentia.js-core.es.js';
// import essentia-wasm-module
import { EssentiaWASM } from './essentia-wasm.es.js';
// create essentia object with all the methods to run various algorithms
// by loading the wasm back-end.
// here, `EssentiaModule` is an emscripten module object imported to the global namespace
let essentia = new Essentia(EssentiaWASM);
// run an specific algorithm
let yourOutput = essentia.'<your-essentia-algo>'(<inputs> ..., <parameters> (optional)...);
yourOutput.'<your_output-key>'
As you can see, in contrary to the essentia python bindings there are no seperate configure and compute methods for the algorithms in essentia.js since we abstract both into a single method.
For example, in real use-cases, it will look like below
const audioCtx = new AudioContext();
let audioURL = "https://freesound.org/data/previews/328/328857_230356-lq.mp3";
// decode audio data
const audioBuffer = await essentia.getAudioBufferFromURL(audioURL, audioCtx);
/* OR
* you could also decode audio from any other
* source and pass to an essentia algorithm. */
// convert the JS float32 typed array into std::vector<float>
const inputSignalVector = essentia.arrayToVector(audioBuffer.getChannelData(0));
// Computing ReplayGain from an input audio signal vector
// The algorithm return float type
// check https://essentia.upf.edu/reference/std_ReplayGain.html
let outputRG = essentia.ReplayGain(inputSignalVector, // input
44100); // sampleRate (parameter optional)
console.log(outputRG.replayGain);
// Running PitchYinProbabilistic algorithm on an input audio signal vector
// check https://essentia.upf.edu/reference/std_PitchYinProbabilistic.html
let outputPyYin = essentia.PitchYinProbabilistic(inputSignalVector, // input
// parameters (optional)
4096, // frameSize
256, // hopSize
0.1, // lowRMSThreshold
'zero', // outputUnvoiced,
false, // preciseTime
44100); //sampleRate
let pitches = essentia.vectorToArray(outputPyYin.pitch);
let voicedProbabilities = essentia.vectorToArray(outputPyYin.voicedProbabilities);
console.log(pitch);
console.log(voicedProbabilities);
outputPyYin.pitch.delete()
outputPyYin.voicedProbabilities.delete()
// CAUTION: only use the `shutdown` and `delete` methods below if you've finished your analysis and don't plan on re-using Essentia again in your program lifecycle.
// call internal essentia::shutdown C++ method
essentia.shutdown();
// delete EssentiaJS instance, free JS memory
essentia.delete();
Similarly, you could use any of the algorithms specified in the Essentia JS Core API.
Examples
Simple web example
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/essentia.js@<version>/dist/essentia-wasm.web.js"></script>
<script src="https://cdn.jsdelivr.net/npm/essentia.js@<version>/dist/essentia.js-core.js"></script>
<script>
let essentia;
EssentiaWASM().then( function(EssentiaWasm) {
essentia = new Essentia(EssentiaWasm);
// prints version of the essentia wasm backend
console.log(essentia.version)
// prints all the available algorithms in essentia.js
console.log(essentia.algorithmNames);
// add your custom audio feature extraction callbacks here
});
</script>
</head>
</html>
NOTE: The above code pattern runs the process on the main UI thread. For costly algorithms, we recommend you to use AudioWorklets or use it inside a Web Worker instead.
Offline audio feature extraction
// generate overlapping frames of audio signal from given parameters
const frames = essentia.FrameGenerator(audioData,
1024, // frameSize
512); // hopSize
// Iterate through every frame and do the desired audio processing
// In this case, we just apply a hanning window to the signal
for (var i=0; i<frames.size(); i++) {
// apply a window (hanning) to the signal using the default parameters
let windowedOut = essentia.Windowing(frames.get(i));
console.log(windowedOut.frame);
// we can add any essentia algorithms here to the compute frame-wise audio feature
}